package FileIO;

import model.Constantes;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.xml.sax.SAXException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;

public class HidratadorPacman {

    private DocumentBuilderFactory dbFactory;
    private Integer numeroDeTick;

    private static HidratadorPacman INSTANCE = null;

    private synchronized static void createInstance() {
        if (INSTANCE == null) {
            INSTANCE = new HidratadorPacman();
        }
    }

    public static HidratadorPacman getInstance() {
        createInstance();
        return INSTANCE;
    }

    @Override
    public Object clone() throws CloneNotSupportedException {
        throw new CloneNotSupportedException();
    }

    private HidratadorPacman() {
        numeroDeTick = 0;
        this.dbFactory = DocumentBuilderFactory.newInstance();
    }

    private String getTagValue(String sTag, Element eElement) {
        return eElement.getAttribute(sTag);
    }

    private void incrementarNumeroDeTicket() {
        numeroDeTick++;
    }

    /**
     * Crea una nueva instancia de laberinto y levanta los datos del xml
     */
    public String obtenerDireccion() {

        String movimientoPacMan = "";
        String rutaArchivo = "";
        boolean noEncontreArchivo = true;
        while (noEncontreArchivo) {

            try {

                DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
                incrementarNumeroDeTicket();
                rutaArchivo = AppConfig.getInstance().getPathEntrada() + AppConfig.getInstance().getPrefijoArchivoPacman() + numeroDeTick.toString() + Constantes.EXTENSION_XML;
                File fXmlFile = new File(rutaArchivo);
                Document doc = dBuilder.parse(fXmlFile);
                doc.getDocumentElement().normalize();
                Element elementRaiz = doc.getDocumentElement();
                Node direccionPacMan = elementRaiz.getElementsByTagName(Constantes.PACMAN).item(0);

                if (direccionPacMan.getNodeType() == Node.ELEMENT_NODE) {
                    Element eElement = (Element) direccionPacMan;
                    movimientoPacMan = getTagValue(Constantes.DIRECCION, eElement).toUpperCase();
                }
                noEncontreArchivo = false;
            } catch (ParserConfigurationException e) {
                System.out.println("Error parseo archivo " + rutaArchivo + " - ");
                numeroDeTick--;
                esperarEnter();
            } catch (SAXException e) {
                System.out.println("Error: archivo " + rutaArchivo + " invalido" + " - ");
                numeroDeTick--;
                esperarEnter();
            } catch (IOException e) {
                System.out.print("No existe el archivo " + rutaArchivo + " - ");
                numeroDeTick--;
                esperarEnter();
            }
            if (movimientoPacMan == null) movimientoPacMan = "";
        }
        return movimientoPacMan;
    }

    private void esperarEnter() {
        System.out.println("Presione ENTER para reintentar.");
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        try {
            reader.readLine();
        } catch (IOException e1) {
        }
    }
}